package pe.gob.mininter.dirandro.vaadin.panel.documento;

import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.Dependencia;
import pe.gob.mininter.dirandro.model.Documento;
import pe.gob.mininter.dirandro.model.Entidad;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.EntidadService;
import pe.gob.mininter.dirandro.service.ValorService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.panel.util.DependeciaPadre;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.UploadDirandro;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class PanelDocumento extends CustomComponent {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private UploadDirandro upArchivo;

	@AutoGenerated
	private HorizontalLayout pnlDocumento2;

	@AutoGenerated
	private ComboBoxLOVS cmbDocPrioridad;

	@AutoGenerated
	private PopupDateField dtDocumento;

	@AutoGenerated
	private PopupDateField dtRecepcion;

	@AutoGenerated
	private TextField txtFolios;

	@AutoGenerated
	private HorizontalLayout pnlDocumento3;

	@AutoGenerated
	private OptionGroup rbAdjunto;

	@AutoGenerated
	private TextField txtAsuntoDoc;

	@AutoGenerated
	private HorizontalLayout pnlDocumento1;

	@AutoGenerated
	private TextField txtDocNumero;

	@AutoGenerated
	private ComboBoxLOVS cmbDocTipo;

	@AutoGenerated
	private HorizontalLayout lytDependencia;

	@AutoGenerated
	private Button btnDependencia;

	@AutoGenerated
	private Label lblDependencia;

	@AutoGenerated
	private HorizontalLayout lytEntidad;

	@AutoGenerated
	private ComboBox cmbProcendenciaId;

	@AutoGenerated
	private ComboBox cmbTipo;

	@AutoGenerated
	private ComboBox cmbProcedencia;

	private static final long serialVersionUID = -5465782691669024632L;
	
	private ValorService valorService;
	private EntidadService entidadService;
	private Documento documento;
	private Dependencia dependencia;
	/**
	 * Las ventanas que incluyan a este panel deben extender de esta intrfaz
	 */
	private DependeciaPadre padre;
	
	private List<Valor> lstProcendencias;
	private List<Valor> lstTipoEntidades;
	private List<Entidad> lstEntidades;
	
	public Dependencia getDependencia() {
		return dependencia;
	}

	public void setDependencia(Dependencia dependencia) {
		this.dependencia = dependencia;
		lblDependencia.setValue( dependencia.getNombre() );
	}

	public DependeciaPadre getPadre() {
		return padre;
	}

	public void setPadre(DependeciaPadre padre) {
		this.padre = padre;
	}

	public PanelDocumento() {
		System.out.println("===================inicia constructor");
		buildMainLayout();
		
		lytDependencia.setVisible(false);
		lytEntidad.setVisible(false);
		
		valorService = Injector.obtenerServicio(ValorService.class);
		entidadService = Injector.obtenerServicio(EntidadService.class);
		setCompositionRoot(mainLayout);
		cmbDocTipo.setCodigoLista(Constante.LISTA.CODIGO.TIPO_DOC_EXP);
		cmbDocPrioridad.setCodigoLista(Constante.LISTA.CODIGO.PRIORIDAD);
		
		cmbDocTipo.setInputPrompt("Tipo de Documento");
		cmbDocPrioridad.setInputPrompt("Prioridad");
		cmbTipo.setInputPrompt("Tipo");
		cmbProcedencia.setInputPrompt("Procedencia");
		cmbProcendenciaId.setInputPrompt("Sub Tipo");
		dtDocumento.setInputPrompt("Fecha del Documento");
		dtRecepcion.setInputPrompt("Fecha de Recepcion");
		
		pnlDocumento2.setVisible(false);
		upArchivo.setVisible(false);
		rbAdjunto.addItem("Si");
		rbAdjunto.addItem("No");
		rbAdjunto.select("No");
		rbAdjunto.setImmediate(true);
		rbAdjunto.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = 4698868300948825907L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean opcion = event.getProperty().getValue().equals("No");
				System.out.println("pinta combo"+opcion);
				if (opcion) {
					pnlDocumento2.setVisible(!opcion);
					upArchivo.setVisible(!opcion);
				}else {
					pnlDocumento2.setVisible(!opcion);
					upArchivo.setVisible(!opcion);
				}
			}
		});
		
		cargarProcedencia();
		System.out.println("padre antes btnDependencia " + getPadre());
		btnDependencia.addListener(new ClickListener() {
			
			private static final long serialVersionUID = 4539783663387871432L;

			@Override
			public void buttonClick(ClickEvent event) {
				
				cargaPanelDependencia();
				
			}
			
		});
	}
	
	private void cargaPanelDependencia(){
		if(getPadre()!=null)
			getPadre().obtenerDependencia();
	}
	
	private void cargarProcedencia(){
		lstProcendencias = valorService.obtenerLista(Constante.LISTA.CODIGO.TABLAS);
		cmbProcedencia.setImmediate(true);
		cmbProcedencia.setContainerDataSource(new BeanItemContainer<Valor>(Valor.class,  lstProcendencias));
		cmbProcedencia.setItemCaptionPropertyId("descripcion");
		cmbProcedencia.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = 6876725531841960773L;
			@Override
			public void valueChange(ValueChangeEvent event) {
				
				cmbTipo.removeAllItems();
				cmbProcendenciaId.removeAllItems();
				
				if (((Valor) cmbProcedencia.getValue()).getCodigo().equals(Constante.VALOR.CODIGO.ENTIDAD)) {
					lytEntidad.setVisible(true);
					lytDependencia.setVisible(false);
					cargaComboTipo(event);
				}else if (((Valor) cmbProcedencia.getValue()).getCodigo().equals(Constante.VALOR.CODIGO.DEPENDENCIA)) {
					lytEntidad.setVisible(false);
					lytDependencia.setVisible(true);
				}
				
			}
		});
	}
	
	private void cargaComboTipo(ValueChangeEvent event){
		if (cmbProcedencia.getValue() != null) {
			lstTipoEntidades = valorService.obtenerLista(Constante.LISTA.CODIGO.ENTIDAD_TIPO);
			cmbTipo.setContainerDataSource(new BeanItemContainer<Valor>(Valor.class,  lstTipoEntidades));
			cmbTipo.setInputPrompt("Tipo de Entidad");
			cmbTipo.setImmediate(true);
			cmbTipo.setItemCaptionPropertyId("nombre");
			cmbTipo.addListener( new ValueChangeListener() {
				
				private static final long serialVersionUID = -4721770533858762047L;

				@Override
				public void valueChange(ValueChangeEvent event) {
					cmbProcendenciaId.removeAllItems();
					cargarEntidadesChange(event);
				}
			});
		}	
	}
	
	private void cargarEntidadesChange(ValueChangeEvent event){
		Entidad entidad = new Entidad();
		entidad.setTipo((Valor) cmbTipo.getValue());
		lstEntidades = entidadService.buscar(entidad);
		cmbProcendenciaId.setContainerDataSource(new BeanItemContainer<Entidad>(Entidad.class, lstEntidades));
		cmbProcendenciaId.setItemCaptionPropertyId("nombre");
	}
	
	public void limpiar() {
		cmbDocPrioridad.setValue(null);
		txtDocNumero.setValue("");
		cmbDocTipo.setValue(null);
		txtAsuntoDoc.setValue("");
		txtFolios.setValue("");
		dtRecepcion.setValue(null);
		dtDocumento.setValue(null);
		upArchivo.limpiar();
	}
	
	public OutputStream getOutputStream() {
		return upArchivo.getOutputStream();
	}

	public Documento getDocumento() {
		if(documento == null) {
			documento = new Documento();
			documento.setTipoDocumento(cmbDocTipo.getValor());
			documento.setNroDocumento((String) txtDocNumero.getValue());
			documento.setPrioridad(cmbDocPrioridad.getValor());
			documento.setAsunto((String) txtAsuntoDoc.getValue());
			documento.setFolios(StringUtils.isNotEmpty((String) txtFolios.getValue()) ? new BigDecimal((String) txtFolios.getValue()) : null);
			documento.setFechaDocumento((Date) dtDocumento.getValue());
			documento.setFechaRecepcion((Date) dtRecepcion.getValue());
			documento.setOsDocumento(getOutputStream());
			documento.setFilename(upArchivo.getFilename());
			documento.setRegistrable(!rbAdjunto.getValue().equals("No"));
			documento.setTablaOrigen((Valor) cmbProcedencia.getValue());
			if ( cmbProcedencia.getValue()!=null && ((Valor) cmbProcedencia.getValue()).getCodigo().equals(Constante.VALOR.CODIGO.ENTIDAD)) {
				documento.setCodigoOrigen( getCodigoProcedencia() );
			}else if ( cmbProcedencia.getValue()!=null && ((Valor) cmbProcedencia.getValue()).getCodigo().equals(Constante.VALOR.CODIGO.DEPENDENCIA)) {
				if(getDependencia()!=null)
				documento.setCodigoOrigen( getDependencia().getId() );
			}
		}
		
		return documento;
	}
	
	public Valor getProcedencia() {
		return (Valor)cmbProcedencia.getValue();
	}
	
	public Long getCodigoProcedencia() {
		if(cmbProcendenciaId.getValue() != null) {
			return (Long)cmbProcendenciaId.getItem(cmbProcendenciaId.getValue()).getItemProperty("id").getValue();
		}
		return null;
	}

	public void setDocumento(Documento documento) {
		this.documento = documento;
	}	
	
	public void setHabilitarCarga(boolean habilitar) {
		cmbDocPrioridad.setEnabled(habilitar);
		cmbDocTipo.setEnabled(habilitar);
		cmbProcedencia.setEnabled(habilitar);
		cmbProcendenciaId.setEnabled(habilitar);
		cmbTipo.setEnabled(habilitar);
		txtAsuntoDoc.setEnabled(habilitar);
		txtDocNumero.setEnabled(habilitar);
		txtFolios.setEnabled(habilitar);
		dtDocumento.setEnabled(habilitar);
		dtRecepcion.setEnabled(habilitar);
		upArchivo.setHabilitar(habilitar);
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout
				.setDescription("Registra la documento que da origen al Parte Policial");
		mainLayout.setWidth("-1px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("-1px");
		setHeight("-1px");
		
		// pnlDocumento1
		pnlDocumento1 = buildPnlDocumento1();
		mainLayout.addComponent(pnlDocumento1);
		
		// pnlDocumento3
		pnlDocumento3 = buildPnlDocumento3();
		mainLayout.addComponent(pnlDocumento3);
		
		// pnlDocumento2
		pnlDocumento2 = buildPnlDocumento2();
		mainLayout.addComponent(pnlDocumento2);
		
		// upArchivo
		upArchivo = new UploadDirandro();
		upArchivo.setImmediate(false);
		upArchivo.setWidth("-1px");
		upArchivo.setHeight("-1px");
		mainLayout.addComponent(upArchivo);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlDocumento1() {
		// common part: create layout
		pnlDocumento1 = new HorizontalLayout();
		pnlDocumento1.setImmediate(false);
		pnlDocumento1.setWidth("-1px");
		pnlDocumento1.setHeight("-1px");
		pnlDocumento1.setMargin(false);
		pnlDocumento1.setSpacing(true);
		
		// cmbProcedencia
		cmbProcedencia = new ComboBox();
		cmbProcedencia.setCaption("Procendencia");
		cmbProcedencia.setImmediate(false);
		cmbProcedencia.setWidth("-1px");
		cmbProcedencia.setHeight("-1px");
		cmbProcedencia.setRequired(true);
		pnlDocumento1.addComponent(cmbProcedencia);
		
		// lytEntidad
		lytEntidad = buildLytEntidad();
		pnlDocumento1.addComponent(lytEntidad);
		
		// lytDependencia
		lytDependencia = buildLytDependencia();
		pnlDocumento1.addComponent(lytDependencia);
		pnlDocumento1.setComponentAlignment(lytDependencia, new Alignment(33));
		
		// cmbDocTipo
		cmbDocTipo = new ComboBoxLOVS();
		cmbDocTipo.setCaption("Tipo de Documento");
		cmbDocTipo.setImmediate(false);
		cmbDocTipo.setDescription("Tipo de Documento");
		cmbDocTipo.setWidth("200px");
		cmbDocTipo.setHeight("-1px");
		pnlDocumento1.addComponent(cmbDocTipo);
		
		// txtDocNumero
		txtDocNumero = new TextField();
		txtDocNumero.setCaption("Numero de Documento");
		txtDocNumero.setImmediate(false);
		txtDocNumero.setDescription("Numero de Documento");
		txtDocNumero.setWidth("150px");
		txtDocNumero.setHeight("-1px");
		txtDocNumero.setRequired(true);
		txtDocNumero.setInputPrompt("Nro de Documento");
		pnlDocumento1.addComponent(txtDocNumero);
		
		return pnlDocumento1;
	}

	@AutoGenerated
	private HorizontalLayout buildLytEntidad() {
		// common part: create layout
		lytEntidad = new HorizontalLayout();
		lytEntidad.setImmediate(false);
		lytEntidad.setWidth("-1px");
		lytEntidad.setHeight("-1px");
		lytEntidad.setMargin(false);
		
		// cmbTipo
		cmbTipo = new ComboBox();
		cmbTipo.setCaption("Tipo");
		cmbTipo.setImmediate(false);
		cmbTipo.setWidth("-1px");
		cmbTipo.setHeight("-1px");
		cmbTipo.setRequired(true);
		lytEntidad.addComponent(cmbTipo);
		
		// cmbProcendenciaId
		cmbProcendenciaId = new ComboBox();
		cmbProcendenciaId.setCaption("Sub Tipo");
		cmbProcendenciaId.setImmediate(false);
		cmbProcendenciaId.setWidth("-1px");
		cmbProcendenciaId.setHeight("-1px");
		cmbProcendenciaId.setRequired(true);
		lytEntidad.addComponent(cmbProcendenciaId);
		
		return lytEntidad;
	}

	@AutoGenerated
	private HorizontalLayout buildLytDependencia() {
		// common part: create layout
		lytDependencia = new HorizontalLayout();
		lytDependencia.setImmediate(false);
		lytDependencia.setWidth("-1px");
		lytDependencia.setHeight("-1px");
		lytDependencia.setMargin(false);
		lytDependencia.setSpacing(true);
		
		// lblDependencia
		lblDependencia = new Label();
		lblDependencia.setImmediate(false);
		lblDependencia.setWidth("200px");
		lblDependencia.setHeight("-1px");
		lblDependencia.setValue("Label");
		lytDependencia.addComponent(lblDependencia);
		lytDependencia.setComponentAlignment(lblDependencia, new Alignment(9));
		
		// btnDependencia
		btnDependencia = new Button();
		btnDependencia.setCaption("Seleccionar");
		btnDependencia.setImmediate(true);
		btnDependencia.setWidth("-1px");
		btnDependencia.setHeight("-1px");
		lytDependencia.addComponent(btnDependencia);
		lytDependencia.setComponentAlignment(btnDependencia, new Alignment(9));
		
		return lytDependencia;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlDocumento3() {
		// common part: create layout
		pnlDocumento3 = new HorizontalLayout();
		pnlDocumento3.setImmediate(false);
		pnlDocumento3.setWidth("-1px");
		pnlDocumento3.setHeight("-1px");
		pnlDocumento3.setMargin(false);
		pnlDocumento3.setSpacing(true);
		
		// txtAsuntoDoc
		txtAsuntoDoc = new TextField();
		txtAsuntoDoc.setCaption("Asunto");
		txtAsuntoDoc.setImmediate(false);
		txtAsuntoDoc.setWidth("600px");
		txtAsuntoDoc.setHeight("-1px");
		txtAsuntoDoc.setRequired(true);
		txtAsuntoDoc.setInputPrompt("Asunto del Documento");
		txtAsuntoDoc.setMaxLength(500);
		pnlDocumento3.addComponent(txtAsuntoDoc);
		
		// rbAdjunto
		rbAdjunto = new OptionGroup();
		rbAdjunto.setStyleName("horizontal");
		rbAdjunto.setCaption("Adjunta Documento?");
		rbAdjunto.setImmediate(false);
		rbAdjunto.setWidth("-1px");
		rbAdjunto.setHeight("20px");
		pnlDocumento3.addComponent(rbAdjunto);
		
		return pnlDocumento3;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlDocumento2() {
		// common part: create layout
		pnlDocumento2 = new HorizontalLayout();
		pnlDocumento2.setImmediate(false);
		pnlDocumento2.setWidth("-1px");
		pnlDocumento2.setHeight("-1px");
		pnlDocumento2.setMargin(false);
		pnlDocumento2.setSpacing(true);
		
		// txtFolios
		txtFolios = new TextField();
		txtFolios.setCaption("Nro. Folios");
		txtFolios.setImmediate(false);
		txtFolios.setWidth("150px");
		txtFolios.setHeight("-1px");
		txtFolios.setRequired(true);
		txtFolios.setInputPrompt("Nro. Folios");
		pnlDocumento2.addComponent(txtFolios);
		
		// dtRecepcion
		dtRecepcion = new PopupDateField();
		dtRecepcion.setCaption("Fecha de Recepcion");
		dtRecepcion.setImmediate(false);
		dtRecepcion.setWidth("150px");
		dtRecepcion.setHeight("-1px");
		dtRecepcion.setRequired(true);
		dtRecepcion.setResolution(4);
		pnlDocumento2.addComponent(dtRecepcion);
		
		// dtDocumento
		dtDocumento = new PopupDateField();
		dtDocumento.setCaption("Fecha del Documento");
		dtDocumento.setImmediate(false);
		dtDocumento.setWidth("150px");
		dtDocumento.setHeight("-1px");
		dtDocumento.setRequired(true);
		dtDocumento.setResolution(4);
		pnlDocumento2.addComponent(dtDocumento);
		
		// cmbDocPrioridad
		cmbDocPrioridad = new ComboBoxLOVS();
		cmbDocPrioridad.setCaption("Prioridad");
		cmbDocPrioridad.setImmediate(false);
		cmbDocPrioridad.setWidth("150px");
		cmbDocPrioridad.setHeight("-1px");
		pnlDocumento2.addComponent(cmbDocPrioridad);
		
		return pnlDocumento2;
	}
}
